<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>数据库角色</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="user-manag.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="user-manag.html">快退</a></td><td width="60%" align="center" valign="bottom">章18. 数据库角色和权限</td><td width="10%" align="right" valign="top"><a href="user-manag.html">快进</a></td><td width="10%" align="right" valign="top"><a href="role-attributes.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="DATABASE-ROLES">18.1. 数据库角色</a></h1><a name="AEN22517"></a><a name="AEN22519"></a><a name="AEN22521"></a><a name="AEN22523"></a>
<p>数据库角色从概念上与操作系统用户是完全无关的。在实际使用中把它们对应起来可能比较方便，但这不是必须的。数据库角色在整个数据库集群中是全局的(而不是每个库不同)。要创建一个角色，使用 SQL 命令 <a href="sql-createrole.html"><i>CREATE ROLE</i></a> 执行：</p>
<pre class="SYNOPSIS">CREATE ROLE <tt class="REPLACEABLE"><i>name</i></tt>;</pre>
<p><tt class="REPLACEABLE"><i>name</i></tt> 遵循 SQL 标识的规则：要么完全没有特殊字符，要么用双引号包围(实际上你通常会给命令增加额外的选项，比如 <tt class="LITERAL">LOGIN</tt>)。要删除一个现有角色，使用类似的 <a href="sql-droprole.html"><i>DROP ROLE</i></a> 命令：</p>
<pre class="SYNOPSIS">DROP ROLE <tt class="REPLACEABLE"><i>name</i></tt>;</pre>
<a name="AEN22534"></a><a name="AEN22536"></a>
<p>为了方便，程序 <a href="app-createuser.html"><span class="APPLICATION">createuser</span></a> 和 <a href="app-dropuser.html"><span class="APPLICATION">dropuser</span></a> 提供了对了这些 SQL 命令的封装。我们可以在 shell 命令上直接调用它们：</p>
<pre class="SYNOPSIS">createuser <tt class="REPLACEABLE"><i>name</i></tt>
dropuser <tt class="REPLACEABLE"><i>name</i></tt></pre>
<p>要检查现有角色的集合，可以检查 <tt class="STRUCTNAME">pg_roles</tt> 系统表，比如：</p>
<pre class="SYNOPSIS">SELECT rolname FROM pg_roles;</pre>
<p><a href="app-psql.html"><span class="APPLICATION">psql</span></a> 的元命令 <tt class="LITERAL">\du</tt> 也可以用于列出现有角色。</p>
<p>为了能创建初始数据库系统，新建立的数据库总是包含一个预定义的"超级用户"角色，并且缺省时(除非在运行 <tt class="COMMAND">initdb</tt> 时更改过)他将和初始化该数据库集群的用户有相同的名称。通常，这个角色名叫 <tt class="LITERAL">postgres</tt> 。为了创建更多角色，你必须首先以这个初始用户角色连接。</p>
<p>每一个和数据库的连接都必须以一个角色身份进行，这个角色决定在该连接上的初始权限。特定数据库连接的角色名是在初始化连接请求的时候声明的。比如，<tt class="COMMAND">psql</tt> 程序使用 <tt class="OPTION">-U</tt> 命令行选项声明它代表的角色。许多应用以当前操作系统的用户名为缺省角色名(这样的应用包括 <tt class="COMMAND">createuser</tt> 和 <tt class="COMMAND">psql</tt>)。所以，在系统用户和数据库角色之间有某种命名关系会让我们工作方便很多。</p>
<p>一个客户端连接可以使用的角色集合是由客户认证设置决定的，在<a href="client-authentication.html">章20</a>里面有解释。因此，一个客户端并不局限于以它的操作系统用户同名的角色进行连接，就像你登录系统的名称不一定要是你的真实姓名一样。因为角色的身份决定了一个连接的权限，所以在多用户环境里仔细配置这些内容是非常重要的。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="user-manag.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="role-attributes.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">数据库角色和权限</td><td width="34%" align="center" valign="top"><a href="user-manag.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">角色属性</td></tr>
</table>
</div>
</body></html>